package com.kfm.am.kt;

import java.util.Random;

public class Test01 {

    public static void main(String[] args) {
        // 接口和抽象类的区别
        // 抽象类可以没有抽象方法，接口必须有抽象方法
        // 抽象类 extends 关键字继承，接口使用 implements 关键字实现
        // 类是单继承，接口可以多实现
        // 接口中的成员变量都是 public static final 修饰的
        // 接口中的方法默认是 public abstract修饰的
        // 在JDK8新增了static和default关键字修饰方法，在JDK9新增private关键字修饰方法，可以有具体实现
        // 抽象类子类重写方法不允许缩小访问权限，接口的实现类重写的方法必须是 public
        // 抽象类可以有构造方法，接口不能有构造方法
        // 类的最高层是 Object ， 接口没有最高层
        // 两者都不能实例化，都是引用数据类型，都可以包含抽象方法
        System.out.println(test("(())((())"));
    }


    public static boolean test(String str) {
        // 栈特征：先进后出
        char[] chars = new char[str.length()];
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '(' || str.charAt(i) == '[' || str.charAt(i) == '{') {
                chars[count++] = str.charAt(i);
            } else if (str.charAt(i) == ')') {
                if (count == 0) {
                    return false;
                }
                if (chars[count - 1] == '(') {
                    count--;
                }
            }
        }
        return count == 0;
    }
}
